package com.heima.user.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.heima.common.dto.PageResponseResult;
import com.heima.common.dto.ResponseResult;
import com.heima.common.enums.AppHttpCodeEnum;
import com.heima.user.dto.ApAuthor;
import com.heima.user.dto.AuthDto;
import com.heima.user.dto.WmUser;
import com.heima.user.entity.ApUser;
import com.heima.user.entity.ApUserRealname;
import com.heima.user.feign.ArticleFeign;
import com.heima.user.feign.MediaFeign;
import com.heima.user.mapper.ApUserRealnameMapper;
import com.heima.user.service.IApUserRealnameService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.user.service.IApUserService;
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * <p>
 * APP实名认证信息表 服务实现类
 * </p>
 *
 * @author lj
 * @since 2022-06-27
 */
@Service
public class ApUserRealnameServiceImpl extends ServiceImpl<ApUserRealnameMapper, ApUserRealname> implements IApUserRealnameService {

    @Autowired
    private MediaFeign mediaFeign;
    @Autowired
    private ArticleFeign articleFeign;
    @Autowired
    private IApUserService apUserService;

    /**
     * 根据状态查询用户认证列表
     * @param dto
     * @return
     */
    @Override
    public ResponseResult listByStatus(AuthDto dto) {
        // 当前页码，页码大小，用户状态
        Long page = dto.getPage();
        Integer size = dto.getSize();
        Integer status = dto.getStatus();
        // 分页查询条件
        IPage<ApUserRealname> iPage = new Page<>(page, size);
        // 条件构造器
        LambdaQueryWrapper<ApUserRealname> query = new LambdaQueryWrapper<>();
        // 根据状态进行查询
        if (status != null) {
            query.eq(ApUserRealname::getStatus, status);
        }
        IPage<ApUserRealname> pageInfo = this.page(iPage, query);
        // 返回结果
        return new PageResponseResult(page, size,pageInfo.getTotal(),pageInfo.getRecords());
    }

    /**
     * 用户审核
     * @param dto
     * @param type
     * @return
     */
    @Override
    @GlobalTransactional
    public ResponseResult auth(AuthDto dto, int type) {
        // APP实名认证根据id查询对象
        ApUserRealname apUserRealname = this.getById(dto.getId());
        // APP用户对象根据APP实名认证对象的user_id查询
        ApUser apUser = apUserService.getById(apUserRealname.getUserId());

        // 接收参数判断
        if (dto==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        // 普通用户判断，成为自媒体人首先成为普通用户
        if (apUser==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }

        // 用户审核 type: 0驳回，1通过
        if (type==0){
            // 驳回，修改用户的认证状态2
            apUserRealname.setStatus(2);
            apUserRealname.setReason(dto.getMsg());
            this.updateById(apUserRealname);
        }else {
            // 创建自媒体人，远程调用
            WmUser wmUser = createWmUser(apUser);

            // 创建文章作者，远程调用
            ApAuthor apAuthor = createApAuthor(apUser,wmUser);

            // 将文章作者的id设置到自媒体用户ap_author_id属性中
            wmUser.setApAuthorId(apAuthor.getId());
            mediaFeign.updateWmUser(wmUser);

            // 通过，修改用户的认证状态9
            apUserRealname.setStatus(9);
            this.updateById(apUserRealname);

            // 修改ap_user用户的认证状态
            apUser.setFlag(1); // 自媒体人
            apUser.setIsIdentityAuthentication(true);
            apUserService.updateById(apUser);
        }
        return ResponseResult.okResult();
    }

    /**
     * 创建自媒体人
     * @param apUser
     * @return
     */
    private WmUser createWmUser(ApUser apUser) {
        WmUser wmUser = new WmUser();
        // wmUser.setId();
        wmUser.setApUserId(apUser.getId());
        // wmUser.setId(); 主键自增
        // wmUser.setApAuthorId(); 怎么设置？后面保存过作者后进行
        wmUser.setName(apUser.getName());
        wmUser.setSalt(apUser.getSalt());
        wmUser.setPassword(apUser.getPassword());
        wmUser.setPhone(apUser.getPhone());
        // wmUser.setEmail(); 邮箱
        // wmUser.setNickname(); 昵称
        // wmUser.setLocation(); 位置
        // wmUser.setLoginTime();
        wmUser.setImage(apUser.getImage());
        wmUser.setStatus(9); // 0 暂时不可用，1 永久不可用，9 正常可用
        wmUser.setType(0); // 账号类型，0 个人，1 企业，2 子账号
        wmUser.setScore(0);
        // 远程调用
        ResponseResult<WmUser> saveWmUser = mediaFeign.saveWmUser(wmUser);
        if (saveWmUser.getCode().equals(0)) {
            return saveWmUser.getData();
        }else {
            throw new RuntimeException("创建自媒体人远程调用失败！");
        }
    }

    /**
     * 创建文章作者
     * @param apUser
     * @param wmUser
     * @return
     */
    private ApAuthor createApAuthor(ApUser apUser, WmUser wmUser) {
        ApAuthor apAuthor = new ApAuthor();
        apAuthor.setUserId(apUser.getId());
        apAuthor.setWmUserId(wmUser.getId());
        apAuthor.setName(apUser.getName());
        apAuthor.setType(2); // 0 爬取数据 ，1 签约合作商，2 平台自媒体人
        // 远程调用
        ResponseResult<ApAuthor> saveApAuthor = articleFeign.saveApAuthor(apAuthor);
        if (saveApAuthor.getCode().equals(0)) {
            return saveApAuthor.getData();
        }else {
            throw new RuntimeException("创建文章作者远程调用失败！");
        }
    }
}
